package fr.syntheses.blog.Model.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.omg.PortableServer.Current;

import fr.syntheses.blog.Model.Mapping.Mapper;
import fr.syntheses.blog.Service.GestionBaseDeDonnees;
import fr.syntheses.blog.beans.Article;
import fr.syntheses.blog.beans.Categorie;
import fr.syntheses.blog.beans.Utilisateur;



public class ArticleDAO  extends ModeleDAO{

	Logger log = Logger.getLogger(currentClassToLog);

	// Variables
	Connection connexion=null;
	ResultSet resultat=null;
	private List<Article> listeArticle;
	// Mapper
	Mapper mapper = new Mapper();

	
    // retourner la liste des clients
	public List<Article> getListeArticle()
	{	
		// Variables
		PreparedStatement requete=null;
		Article article=null;
		String requeteString=null;
		listeArticle=new ArrayList<Article>();
		
		try {
			// Ouverture d'une connexion
			connexion=super.getConnection();
			
			// requete pour la liste des clients
			requeteString="SELECT article.*,categorie.id cid, categorie.categorie, utilisateur.id uid, utilisateur.* " +
					"(select count(*) from commentaire where ArticleId=article.Id) nombreCommentaire " +
					"FROM article, categorie, utilisateur " +
					"WHERE CategorieId=categorie.Id AND article.UtilisateurId=utilisateur.Id " +
					"ORDER BY article.id";
			requete=connexion.prepareStatement(requeteString);
			System.err.println(requeteString);
			
			// Execution de la requ�te
			resultat=requete.executeQuery();


			// On stocke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					article=mapper.mapperArticle(resultat);
					
					// On ajoute l'objet a la liste des articles
					listeArticle.add((Article)article);
				}
			}
		}
		catch(Exception e)
		{
			log.error("Erreur dans la requete dans la classe UtilisateurDAO fonction getListeUtilisateur");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				log.error("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe UtilisateurDAO fonction getListeUtilisateur");
			}	
		}
		return listeArticle;
	}

	public void create(Article article) {
		
		PreparedStatement requete=null;
		String requeteString=null;
		
		try{
			connexion = super.getConnection();
			
			requeteString="INSERT INTO article (CategorieId, UtilisateurId, Titre, Contenu) VALUES (?,?,?,?)";

			requete=connexion.prepareStatement(requeteString);

			requete.setObject(1, article.getCategorie());
			requete.setObject(2, article.getAuteur());
			requete.setString(3, article.getTitre());
			requete.setString(4, article.getContenu());
			
			System.out.println("requete :" + requete);
			
			System.err.println(requeteString);

			int errorCode = requete.executeUpdate();
		}
		catch(Exception e)
		{
			log.error("Erreur dans la requete dans la classe ArticleDAO fonction create" + e);
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				log.error("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ArticleDAO fonction create" + ex);
			}	
		}
	}

	public void createXml(Article article) {
		
		PreparedStatement requete=null;
		String requeteString=null;
		
		try{
			connexion = super.getConnection();
			requeteString="INSERT INTO article (CategorieId, UtilisateurId, Titre, Contenu, Datepublication)" +
					" SELECT c.Id, u.Id, ?, ?, ?" +
					" FROM categorie c, utilisateur u" +
					" WHERE c.Categorie = ?" +
					" AND u.Login = ?";

			requete=connexion.prepareStatement(requeteString);

			requete.setString(1, article.getTitre());
			requete.setString(2, article.getContenu());
			requete.setString(3, article.getDatepublication().toString());
			requete.setObject(4, article.getCategorie());
			requete.setObject(5, article.getAuteur());
			
			System.out.println("requete :" + requete);
			
			System.err.println(requeteString);

			int errorCode = requete.executeUpdate();
		}
		catch(Exception e)
		{
			log.error("Erreur dans la requete dans la classe ArticleDAO fonction createXml" + e);
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				log.error("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ArticleDAO fonction createXml" + ex);
			}	
		}
	}

	
	public void read() {
	}

	public void update() {
	}

	public void delete() {
	}
	
}